﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BaseLinQ.DataContex;
using DevExpress.Web.ASPxGridView;
using Module;
using Core;
using System.Data;
using Solution.AppCode;


namespace Solutions.Admin.QuanLyDonVi
{
    public partial class QuanLyDonVi : System.Web.UI.UserControl
    {
        public string _conn = ConfigurationSettings.AppSettings["ConnectString"];
        private const int ROOT = 1;
        public static int _iParent = 0;
        public static int idem = 1;
        Utils util = new Utils();
        long idVaiTro = 0;
        long idUser = 0;
        public long GetDonViThaoTac()
        {
            idVaiTro = long.Parse(Utils.GetSession_value(Response, Page, Constants.session_vaitroquanly_id));
            idUser = long.Parse(Utils.GetSession_value(Response, Page, Constants.session_user_id));
            return util.LayDonviThaoTac(idVaiTro, idUser, "DON_VI", Constants.ACTION_READ, "QuanLyDonVi");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (grdQuanLyDonVi.IsCallback || !Page.IsPostBack)
            {
                BindDataTogrdQuanLyDonVi();
                BindDataTocboDonViCha(GetDonViThaoTac());
            }
        }

        protected void BindDataTogrdQuanLyDonVi()
        {
            var result = new DonViLogic().ListTreeDonVi(GetDonViThaoTac());

            grdQuanLyDonVi.DataSource = result;
            grdQuanLyDonVi.DataBind();
        }

        protected void BindDataTocboDonViCha(long _idDonViRoot)
        {
            var result = new DonViLogic().GetTreeDonVi(_idDonViRoot);
            cboDonViCha.DataSource = result;
            cboDonViCha.DataBind();
        }

        protected void ResetForm()
        {
            txtTenDonVi.Text = "";
            txtMaDonVi.Text = "";
            txtDiaChi.Text = "";
            txtGhiChu.Text = "";
            chkKichHoat.Checked = false;
            cboDonViCha.SelectedIndex = 0;
        }

        public void grdQuanLyDonVi_RowCommand(object sender, ASPxGridViewRowCommandEventArgs e)
        {
            int id = Convert.ToInt32(e.KeyValue);
            switch (e.CommandArgs.CommandName)
            {
                case "Edit":
                    try
                    {
                        DonViLogic objDonViLogic = new DonViLogic();
                        btnLuuLai.Visible = false;
                        btnLuuSua.Visible = true;
                        txtMaDonVi.ReadOnly = true;
                        wdsQuanLyDonVi.ShowOnPageLoad = true;
                        tbl_Donvi objDonVi = objDonViLogic.SelectByID(id);

                        //Bind Data 
                        txtpk_iDonViID.Text = objDonVi.pk_iDonViID.ToString();
                        txtTenDonVi.Text = objDonVi.sTenDonVi;
                        txtMaDonVi.Text = objDonVi.sMaDonVi;
                        txtDiaChi.Text = objDonVi.sDiaChi;
                        txtGhiChu.Text = objDonVi.sGhiChu;
                        cboDonViCha.Text = objDonViLogic.SelectByID((long)objDonVi.iParent_ID).sTenDonVi;
                        chkKichHoat.Checked = (bool)objDonVi.Status;
                    }
                    catch (Exception ex)
                    {
                    }
                    break;
                case "Delete":
                    try
                    {
                        Delete(TypeHelper.ToInt32(id.ToString()));
                        Tools.Message(this.Page, "Xóa thành công");
                    }
                    catch (Exception ex)
                    {
                        Tools.Message(this.Page, "Xóa thất bại");
                    }
                    break;
            }
        }

        protected void btnOpenForm_Click(object sender, EventArgs e)
        {
            btnLuuLai.Visible = true;
            btnLuuSua.Visible = false;
            wdsQuanLyDonVi.ShowOnPageLoad = true;
            ResetForm();
            txtMaDonVi.Focus();
        }

        protected void btnLuuLai_Click(object sender, EventArgs e)
        {
            var db = new RBACDataContext(_conn);
            string strTenDonVi = Tools.ChuanHoaXau(txtTenDonVi.Text);
            string strDiaChi = Tools.ChuanHoaXau(txtDiaChi.Text);
            string strMoTa = Tools.ChuanHoaXau(txtGhiChu.Text);
            string strMaDonVi = Tools.ChuanHoaXau(txtMaDonVi.Text);

            DonViLogic objLogic = new DonViLogic();
            tbl_Donvi obj = new tbl_Donvi();

            if (cboDonViCha.Value == null)
            {
                Tools.Message(this.Page, "Đơn vị quản lý không được bỏ trống");
                cboDonViCha.Focus();
                return;
            }
            if (Tools.ChuanHoaXau(txtMaDonVi.Text) == "")
            {
                Tools.Message(this.Page, "Mã đơn vị không được bỏ trống");
                txtMaDonVi.Focus();
                return;
            }

            if (Tools.ChuanHoaXau(txtMaDonVi.Text) != "")
            {
                DonViLogic objdonvi = new DonViLogic();
                long iddonvi = 0;
                if (Session[Constants.session_donviquanly_id] != null)
                {
                    iddonvi = long.Parse(Session[Constants.session_donviquanly_id].ToString());
                }
                else
                    Response.Redirect(ResolveUrl("~/Admin/ChonVaiTro/Default.aspx"));
                DataTable dt = objdonvi.ListDonvi(iddonvi);
                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        var listDonvi = from m in db.tbl_Donvis
                                        where m.sMaDonVi == txtMaDonVi.Text && m.Status == true && Equals(m.pk_iDonViID, dt.Rows[i][0].ToString())
                                        select m;
                        if (listDonvi.Count() > 0)
                        {
                            Tools.Message(this.Page, "Trùng mã đơn vị! Vui lòng nhập lại");
                            txtMaDonVi.Focus();
                            return;
                        }
                    }
                }
            }
            if (Tools.ChuanHoaXau(txtTenDonVi.Text) == "")
            {
                Tools.Message(this.Page, "Tên đơn vị không được để trống");
                txtTenDonVi.Focus();
                return;
            }
            tbl_Donvi sysroot = (from m in db.tbl_Donvis
                                 where m.iParent_ID == null
                                 && m.Status == true
                                 select m).FirstOrDefault<tbl_Donvi>();
            DataTable datatb = objLogic.GetIndentityIdDonvi("tbl_Donvi");
            int value = TypeHelper.ToInt32(datatb.Rows[0][0].ToString()) + 1;
            obj.iParent_ID = TypeHelper.ToInt32(cboDonViCha.Value.ToString());
            obj.sMaDonVi = strMaDonVi;
            obj.sTenDonVi = strTenDonVi;
            obj.sDiaChi = strDiaChi;
            obj.sGhiChu = strMoTa;
            obj.bKichHoat = true;
            obj.fk_iNguoiTaoID = UtilsData.GetUserId();
            obj.dNgayTao = DateTime.Now;
            obj.Status = true;
            obj.fk_iDonViQuanLyId = UtilsData.GetUserDepartment();
            obj.sMaDangKy = String.Format("{0:000000}", value);
            long res = objLogic.Insert(obj);
            if (res > 0)
            {
                obj.sPath = objLogic.SelectByID(long.Parse(cboDonViCha.Value.ToString())).sPath + obj.pk_iDonViID + "/";
                objLogic.UpdateSpath(obj);
                Tools.Message(this.Page, "Thêm mới đơn vị thành công");
            }
            txtMaDonVi.Focus();
            txtMaDonVi.Text = "";
            txtTenDonVi.Text = "";
            txtDiaChi.Text = "";
            db = null;

            BindDataTogrdQuanLyDonVi();
        }

        protected void btnLuuSua_Click(object sender, EventArgs e)
        {
            var db = new RBACDataContext(_conn);
            string strTenDonVi = Tools.ChuanHoaXau(txtTenDonVi.Text);
            string strDiaChi = Tools.ChuanHoaXau(txtDiaChi.Text);
            string strMoTa = Tools.ChuanHoaXau(txtGhiChu.Text);
            string strMaDonVi = txtMaDonVi.Text;
            DonViLogic objLogic = new DonViLogic();
            tbl_Donvi obj = new tbl_Donvi();
            long _idDonVi = long.Parse(txtpk_iDonViID.Text);

            tbl_Donvi _donvi = objLogic.SelectByID(_idDonVi);
            tbl_Donvi sysroot = (from m in db.tbl_Donvis
                                 where m.iParent_ID == null
                                 && m.Status == true
                                 select m).FirstOrDefault<tbl_Donvi>();
            if (cboDonViCha.Value == null && _donvi.iParent_ID != null)
            {
                Tools.Message(this.Page, "Đơn vị quản lý không được bỏ trống");
                cboDonViCha.Focus();
                return;
            }
            if (Tools.ChuanHoaXau(txtMaDonVi.Text) == "")
            {
                Tools.Message(this.Page, "Mã đơn vị không được bỏ trống");
                txtMaDonVi.Focus();
                return;
            }

            if (Tools.ChuanHoaXau(txtTenDonVi.Text) == "")
            {
                Tools.Message(this.Page, "Tên đơn vị không được để trống");
                txtTenDonVi.Focus();
                return;
            }
            if (cboDonViCha.Value != "")
            {
                if (objLogic.CheckDonViChaCon(long.Parse(cboDonViCha.Value.ToString()), _idDonVi))
                {
                    Tools.Message(this.Page, "Không thể gán đơn vị quản lý này");
                    return;
                }
                if (txtMaDonVi.Text != "")
                {
                    var list = db.tbl_Donvis.SingleOrDefault(m => m.pk_iDonViID == TypeHelper.ToInt32(txtpk_iDonViID.Text));
                    if (list != null)
                    {
                        if (list.sMaDonVi == txtMaDonVi.Text)
                        {
                            obj.sMaDonVi = txtMaDonVi.Text;
                        }
                        else
                        {
                            DonViLogic objdonvi = new DonViLogic();
                            DataTable dt = objdonvi.ListDonvi(Utils.GetRootDepartmentID(GetDonViThaoTac()));
                            if (dt.Rows.Count > 0)
                            {
                                for (int i = 0; i < dt.Rows.Count; i++)
                                {
                                    var listDonvi = from m in db.tbl_Donvis
                                                    where m.sMaDonVi == txtMaDonVi.Text && m.Status == true && Equals(m.pk_iDonViID, dt.Rows[i][0].ToString())
                                                    select m;
                                    if (listDonvi.Count() > 0)
                                    {
                                        Tools.Message(this.Page, "Trùng mã đơn vị! Vui lòng nhập lại!");
                                        txtMaDonVi.Focus();
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
                if (cboDonViCha.Value != null && _donvi.iParent_ID != null)
                {
                    obj.iParent_ID = TypeHelper.ToInt32(cboDonViCha.Value.ToString());
                }
                obj.pk_iDonViID = TypeHelper.ToInt32(txtpk_iDonViID.Text);
                obj.sMaDonVi = strMaDonVi;
                obj.sTenDonVi = strTenDonVi;
                obj.sDiaChi = strDiaChi;
                obj.sGhiChu = strMoTa;
                obj.Status = true;
                if (obj.iParent_ID != null && obj.iParent_ID > 0)
                {
                    obj.sPath = objLogic.SelectByID(long.Parse(cboDonViCha.Value.ToString())).sPath + obj.pk_iDonViID + "/";
                }
                long res = objLogic.Update(obj);
                if (res > 0)
                {
                    Tools.Message(this.Page, "Cập nhật đơn vị thành công");
                }
                BindDataTogrdQuanLyDonVi();
                LoadCboDonVi(GetDonViThaoTac());
                ResetForm();
                wdsQuanLyDonVi.ShowOnPageLoad = false;
            }
            else
            {
                Tools.Message(this.Page, "Không được thay đổi thông tin đơn vị quản lý");
                BindDataTogrdQuanLyDonVi();
                LoadCboDonVi(GetDonViThaoTac());
                wdsQuanLyDonVi.ShowOnPageLoad = false;
            }
        }

        public void LoadCboDonVi(long _idDonViRoot)
        {
            DonViLogic logicDV = new DonViLogic();
            List<tbl_Donvi> lstDonVi = new List<tbl_Donvi>();
            lstDonVi = logicDV.GetTreeDonVi(_idDonViRoot);
            cboDonViCha.DataSource = lstDonVi;
            cboDonViCha.DataBind();
        }

        public void Delete(long ma)
        {
            DonViLogic objDonvi = new DonViLogic();
            var db = new RBACDataContext(_conn);
            tbl_Donvi obj = db.tbl_Donvis.SingleOrDefault(c => c.pk_iDonViID == ma);
            try
            {
                if (GetDonViThaoTac() == ma)
                {
                    Tools.Message(this.Page, "Không thể xóa");
                    return;
                }
                if (GetListDonViParent(ma) == 1)
                {
                    Tools.Message(this.Page, "Không xóa được! Có đơn vị cấp dưới");
                    return;
                }
                else
                {
                    var listNguoidung = from nd in db.tbl_NguoiDungs
                                        where nd.fk_iDonViID == ma
                                        && nd.bKichHoat == true
                                        select nd;
                    var lstPhanVT = from q in db.tbl_VaiTroNguoiDungDonVis
                                    where q.bKichHoat == true
                                    && q.fk_iDonViID == ma
                                    select q;
                    var lstPhanQuyen = from p in db.tbl_NguoiDungQuyenDonVis
                                       where p.fk_iDonViID == ma
                                       select p;
                    if (listNguoidung != null && listNguoidung.Count() > 0)
                    {
                        Tools.Message(this.Page, "Đơn vị này đã được gán cho người dùng! Không xóa được");
                        BindDataTogrdQuanLyDonVi();
                        LoadCboDonVi(GetDonViThaoTac());
                        return;
                    }
                    else if (lstPhanVT.Count() > 0)
                    {
                        Tools.Message(this.Page, "Đơn vị này đã được phân quyền cho người dùng! Không xóa được");
                        BindDataTogrdQuanLyDonVi();
                        LoadCboDonVi(GetDonViThaoTac());
                        return;
                    }
                    else
                    {
                        if (objDonvi.Delete(ma) == 1)
                        {
                            Tools.Message(this.Page, "Xóa đơn vị thành công");
                            BindDataTogrdQuanLyDonVi();
                            LoadCboDonVi(GetDonViThaoTac());
                        }
                        else
                            Tools.Message(this.Page, "Xóa thất bại");
                    }
                }
            }
            catch (Exception ex)
            {
                Tools.Message(this.Page, "Lỗi");
            }
        }

        public long GetListDonViParent(long intid)
        {
            var db = new RBACDataContext(_conn);
            List<tbl_Donvi> _list = (from obj in db.tbl_Donvis
                                     where obj.iParent_ID == intid && obj.Status == true
                                     select obj).ToList<tbl_Donvi>();
            if (_list != null && _list.Count > 0)
            {
                return 1;
            }
            return 0;
        }
    }
}